package com.testing.common;

import com.sun.org.apache.xpath.internal.operations.Bool;
import com.testing.inter.InterKeyWord;
import com.testing.web.WebKeyword;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.xmlbeans.impl.regex.Match;

import java.io.IOException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Classname AutoTools
 * @Description 类型说明
 * @Date 2022/10/14 20:26
 * @Created by 特斯汀Roy
 */
public class AutoTools {
    //公用的日志记录logger
    public static Logger log = LogManager.getLogger(AutoTools.class);

    public static Pattern uniPattern = Pattern.compile("\\\\u([0-9A-Fa-f]{4})");

    //更多变量怎么存
    public static String goods = "VIP13测试商品" + WebKeyword.dateStr("ddHHmmss");
    //    public static String shop_price="300";
    //如果需要在多个地方使用的变量，都存到AutoTools里面，想用的时候从里面拿出来用
    public static Map<String, String> paramMap = new HashMap<>();

    public static String dateStr(String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        String format = sdf.format(new Date());
        return format;
    }

    public static String randomString(String... params) {
        //通过随机的下标取值
        Random random = new Random();
        int nextInt = random.nextInt(params.length);
        return params[nextInt];
    }

    /**
     * 用于完成unicode解析的方法。
     *
     * @param origin
     * @return
     */
    public static String unicodeDecode(String origin) {
        Matcher matcher = uniPattern.matcher(origin);
        StringBuffer stringBuffer = new StringBuffer(origin.length());
        while (matcher.find()) {
            //java中使用的就是unicode编码，可以将4位16进制数转成10进制，然后直接强转为char得到对应的字符
            matcher.appendReplacement(stringBuffer, (char) (Integer.parseInt(matcher.group(1), 16)) + "");
        }
        matcher.appendTail(stringBuffer);
        return stringBuffer.toString();
    }


    //完成变量的存储。
    public static boolean saveParam(String paramName, String value) {
        paramMap.put(paramName, value);
        return true;
    }

    /**
     * 如果字符串中有变量就替换，没有就不动它。
     * //进行变量的获取
     * //查找字符串中是否有{变量名}，如果有，就进行替换。
     * //对每个变量名，查找一下，字符串里有没有它，有就替换所有的
     *
     * @param origin
     * @return
     */
    public static String useParam(String origin) {
        for (String key : paramMap.keySet()) {
            origin = origin.replaceAll("\\{" + key + "\\}", paramMap.get(key));
        }
        return origin;
    }

    /***
     * 存储一个拼接时间戳的变量
     * @param paramName
     * @param originStr
     * @param datePattern
     */
    public static void saveDateParam(String paramName, String originStr, String datePattern) {
        String paramvalue = originStr + dateStr(datePattern);
        paramMap.put(paramName, paramvalue);
    }

    public static void saveEncParam(String paramName, String origin) {
        EncryptUtils enc = new EncryptUtils();
        saveParam(paramName, enc.enCrypt(useParam(origin)));
    }

    public static void runCmd(String cmd) throws IOException {
        log.info("执行命令" + cmd);
        Runtime.getRuntime().exec("cmd /c start " + cmd);
    }


    /**
     * @param something  可以是任何类型的关键字类。
     * @param rowContent 读取到的用例的信息
     * @param col        表示关键字所在的列数
     * @return 执行是否成功
     */
    public static boolean invokeKeyWord(Object something, List<String> rowContent, int col) {
        Class<?> aClass = something.getClass();
        Method method;
        try {
            method = aClass.getMethod(rowContent.get(col));
            //方法找到相应对象来执行。
            Object invoke = method.invoke(something);
            //如果执行成功了，判断是不是布尔值
            if (invoke instanceof Boolean) {
                return (boolean) invoke;
            } else {
                return true;
            }
        } catch (Exception e) {
        }
        try {
            method = aClass.getMethod(rowContent.get(col), String.class);
            Object invoke = method.invoke(something, rowContent.get(col + 1));
            if (invoke instanceof Boolean) {
                return (boolean) invoke;
            } else {
                return true;
            }
        } catch (Exception e) {
        }
        try {
            method = aClass.getMethod(rowContent.get(col), String.class, String.class);
            Object invoke = method.invoke(something, rowContent.get(col + 1), rowContent.get(col + 2));
            if (invoke instanceof Boolean) {
                return (boolean) invoke;
            } else {
                return true;
            }
        } catch (Exception e) {
        }
        try {
            method = aClass.getMethod(rowContent.get(col), String.class, String.class, String.class);
            Object invoke = method.invoke(something, rowContent.get(col + 1), rowContent.get(col + 2), rowContent.get(col + 3));
            if (invoke instanceof Boolean) {
                return (boolean) invoke;
            } else {
                return true;
            }
        } catch (Exception e) {
            //如果前面全部都没有return，那就没找到方法
            log.error("没找到名为" + rowContent.get(col) + "的方法");
            return false;
        }
    }

}
